import StringBuilder from "../core/string-builder";


/**
 * 日期对象 - 年表
 *
 * 由 java 对象序列化而来的数据
 *
 * from: java.time.chrono.IsoChronology
 */
export interface IsoChronology {
    id: string; // e.g., "ISO"
    calendarType: string;// e.g., "iso8601"
}

/**
 * 日期对象
 *
 * 由 java 对象序列化而来的数据
 *
 * from: java.time.LocalDate or java.time.LocalDateTime
 */
export interface LocalDate {
    month: string; // e.g., "AUGUST"
    year: number;
    dayOfMonth: number;
    hour: number;
    minute: number;
    monthValue: number;
    nano: number; // Nanoseconds
    second: number;
    dayOfWeek: string; // e.g., "MONDAY"
    dayOfYear: number;
    chronology: IsoChronology;
}


/**
 * 对象转为 Date 类型
 *
 * @param obj
 * @returns 日期类型
 */
const caseToDate = (obj: LocalDate): Date => {
    // 创建一个新的Date对象
    let date = new Date();

    // 设置年份、月份
    date.setFullYear(obj.year);
    // 月份从 0 开始计数，所以要减 1
    date.setMonth(obj.monthValue - 1);
    date.setDate(obj.dayOfMonth);

    // 设置小时、分钟、秒和毫秒
    date.setHours(obj.hour);
    date.setMinutes(obj.minute);
    date.setSeconds(obj.second);
    return date;
}

/**
 * 将日期对象转换为日期字符串
 *
 * @param obj 日期对象
 * @returns 格式化后的日期字符串
 */
const date = (obj: LocalDate): string => {
    return new StringBuilder()
        .append(obj.year).append('-')
        .appendNumber(obj.monthValue, 2).append('-')
        .appendNumber(obj.dayOfMonth, 2)
        .build();
}

/**
 * 将日期对象转换为日期时间字符串
 *
 * @param obj 日期对象
 * @returns YYYY-MM-DD HH:mm:ss 格式的日期时间字符串
 */
const datetime = (obj: LocalDate): string => {
    return new StringBuilder()
        .append(obj.year).append('-')
        .appendNumber(obj.monthValue, 2).append('-')
        .appendNumber(obj.dayOfMonth, 2).append(' ')
        .appendNumber(obj.hour, 2).append(':')
        .appendNumber(obj.minute, 2).append(':')
        .appendNumber(obj.second, 2)
        .build();
}

/**
 * 将日期对象转换为紧凑日期字符串
 *
 * @param obj 日期对象
 * @returns YYYYMMDD 格式的日期字符串
 */
const compactDate = (obj: LocalDate): string => {
    return new StringBuilder()
        .append(obj.year)
        .appendNumber(obj.monthValue, 2)
        .appendNumber(obj.dayOfMonth, 2)
        .build();
}


/**
 * 将日期对象转换为紧凑日期时间字符串
 * @param obj 日期对象
 * @returns YYYYMMDDHHmmss 格式的日期时间字符串
 */
const compactDatetime = (obj: LocalDate): string => {
    return new StringBuilder()
        .append(obj.year)
        .appendNumber(obj.monthValue, 2)
        .appendNumber(obj.dayOfMonth, 2)
        .appendNumber(obj.hour, 2)
        .appendNumber(obj.minute, 2)
        .appendNumber(obj.second, 2)
        .build();
}

/**
 * 处理 java.time 下的日期格式
 *
 * 考虑到跨时区的情况，需要将日期转为当地时间；
 *
 * 当前不是最佳设计，但是如需变动相关逻辑，直接改动当前代码。
 */
export default {
    caseToDate,

    date, datetime, compactDate, compactDatetime
}